package class2;

import java.util.Arrays;

/**
 * 给定能随机生成整数1到5的函数,写出能随机生成整数1到7的函数
 * 1.先将默认函数修改成[0,1]随机函数
 * 2.然后向左移，拼接出1-7的值
 * 3.当数字为0重新生成
 * <p>
 * 扩展：
 * 假设想返回17-56之间等概率的数
 * //当 v 不满足 17 ≤ v ≤ 56 时，我们丢弃该结果，重新生成。
 * //由于丢弃的结果不会影响剩下范围内的随机数分布，每个合法数值的概率仍然是相等的
 */
public class Code02_NumberRand {
    public static void main(String[] args) {
        int[] counts = new int[8];
        for (int i = 0; i < 1000000; i++) {
            counts[f2()]++;
        }
        System.out.println(Arrays.toString(counts));
    }

    // 返回0 ~ 6
    public static int f2() {
        int v;
        do {
            v = number();
        } while (v == 0); //只需要1-7，因此返回0时，重新生成
        return v;
    }

    // 返回数字000~111 0-7之间的随机数
    public static int number() {
        return (f1() << 2) + (f1() << 1) + (f1() << 0);
    }

    // 等概率返回0和1
    public static int f1() {
        int x;
        do {
            x = f();
        } while (x == 3);
        return x > 3 ? 1 : 0;
    }

    /**
     * 默认函数返回1-5随机数
     */
    public static int f() {
        return (int) (Math.random() * 5) + 1;
    }
}
